package com.jd.platform.sample2.config;

import com.jd.platform.hotkey.client.callback.JdHotKeyStore;
import com.jd.platform.hotkey.client.core.rule.KeyRuleHolder;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Component
public class ShadowKeyExpirationListener implements MessageListener {

    @Resource
    private RedisTemplate<String, Object> redis2Template;

    // 影子键前缀（与主键区分）
    private static final String SHADOW_KEY_PREFIX = "pre_";

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expiredShadowKey = new String(message.getBody());

        // 1. 判断是否为影子键（避免处理无关key）
        if (!expiredShadowKey.startsWith(SHADOW_KEY_PREFIX)) {
            System.out.println("过期的key不是不是影子键");
        }
        // 2. 从影子键解析出主键（去掉前缀）
        String mainKey = expiredShadowKey.replace(SHADOW_KEY_PREFIX, "");
        // 3. 判断此时主键是否还是hotkey
        if(JdHotKeyStore.get(mainKey)==null) { //JdHotKeyStore并认为主键不是hotkey，需要删除主键
            redis2Template.delete(mainKey);
        } else { //JdHotKeyStore并认为主键还是hotkey，需要重新续上影子键
            // 2. 创建影子键（设过期时间，value为空字符串节省空间）
            int time= KeyRuleHolder.duration(mainKey);
            redis2Template.opsForValue().set(expiredShadowKey, "", time, TimeUnit.SECONDS);
        }
    }
}
